<?php

require 'lib/model/om/BaseCriteriuPeer.php';

class CriteriuPeer extends BaseCriteriuPeer
{
    # constante simbolice pentru codurile criteriilor
    # Pentru fiecare criteriu va exista cate o clasa avand numele de tipul `Criteriu`+<denumire CamelCase a criteriului>
    const CRITERIU_APA_CALDA    = 'apa_calda';
    const CRITERIU_APA_RECE     = 'apa_rece';
    const CRITERIU_BENEFICIAR   = 'beneficiar';
    const CRITERIU_EGAL         = 'egal';
    const CRITERIU_CONSUM_APA_CALDA     = 'consum_ac';
    const CRITERIU_CONSUM_APA_RECE      = 'consum_ar';
    const CRITERIU_APOMETRE_APA_CALDA   = 'nr_apom_ac';
    const CRITERIU_APOMETRE_APA_RECE    = 'nr_apom_ar';
    const CRITERIU_APOMETRE     = 'nr_apom';
    const CRITERIU_PERSOANE     = 'nr_persoane';
    const CRITERIU_SET          = 's_e_t';
    const CRITERIU_SUPRAFATA    = 'suprafata';
    const CRITERIU_REPARTITOARE = 'nr_repartitoare';
    const CRITERIU_ELEMENTI     = 'nr_elementi';

    /**
     * Creeaza un criteriu
     * @param string|int $codCriteriu Daca este de tip numeric, se foloseste IDul criteriul; altfel, se foloseste codul criteriului
     * @return Criteriu
     */
    static public function factory( $codCriteriu )
    {
        if ( empty($codCriteriu) ) return null;

        $criteria = new Criteria();
        $criteria->add(is_numeric($codCriteriu) ? self::ID : self::COD, $codCriteriu);

        $criteriu = self::doSelectOne($criteria);
        if ( $criteriu )
        {
            $className = self::buildCriteriuClassName($criteriu->getCod());

            if ( class_exists($className) )
            {
                // instantiez criteriul si il returnez
                $newCriteriu = new $className();
                $criteriu->copyInto($newCriteriu, true);
                $newCriteriu->setNew(false);
                $newCriteriu->setId($criteriu->getId());

                return $newCriteriu;
            }
        }

        throw new sfFactoryException('Criteriul "'.$codCriteriu.'" nu este definit');

    }

    /**
     * Constuieste denumirea clasei unui criteriu pe baza codului acestuia
     * Numele clasei criteriului este formats din CLASS_PREFIX si denumirea CamelCase a criteriului
     * Clasa criteriului se gaseste in //apps/frontend/lib/criterii
     *
     * @param string $codCriteriu
     * @return string
     */
    protected static function buildCriteriuClassName($codCriteriu)
    {
        // normalize the value
        $codCriteriu = trim(strtolower($codCriteriu));
        if (!strlen($codCriteriu))
        {
            return false;
        }

        // CamelCase the value
        $codCriteriuCamelCase = ucfirst(sfInflector::camelize($codCriteriu));

        $criteriuClassName = self::OM_CLASS . $codCriteriuCamelCase;

        return $criteriuClassName;
    }

    /**
     * Returneaza un array format din perechi [id_criteriu => descriere_criteriu]
     *
     * @param array $choices O lista continand coduri ale criteriilor
     */
    public static function getChoices(array $choices)
    {
        $result = array();

        $criteria = new Criteria();
        $criteria
            ->add(self::COD, $choices, Criteria::IN)
            ->addSelectColumn(self::ID)
            ->addSelectColumn(self::DESCRIERE);
        $stmt = self::doSelectStmt($criteria);
        while ($row = $stmt->fetch(PDO::FETCH_ASSOC))
        {
            $result[$row['ID']] = $row['DESCRIERE'];
        }

        return $result;
    }

}
